/**
 * 
 */
package com.cssy.yd.logic.service.impl;

import java.util.Date;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.alibaba.fastjson.JSONArray;
import com.byd.acegiext.domain.User;
import com.cssy.yd.logic.dao.LogicSoDAO;
import com.cssy.yd.logic.dao.LogicSoWarefreezeDAO;
import com.cssy.yd.logic.dao.LogicSoWarefreezeItemDAO;
import com.cssy.yd.logic.entity.LogicSoDO;
import com.cssy.yd.logic.entity.LogicSoWarefreezeDO;
import com.cssy.yd.logic.entity.LogicSoWarefreezeItemDO;
import com.cssy.yd.logic.service.ILogicSoWarefreezeService;
import com.plat.exception.SyBaseException;
import com.plat.helper.SearchCondition;
import com.plat.helper.SearchConditions;
import com.plat.helper.SearchResult;
import com.plat.util.DateUtils;
import com.plat.util.GlobalResLoader;
import com.plat.util.IDCodeTypeUtil;
import com.plat.util.SessionUtil;
import com.yuendong.sy.po.code.SyCode;
import com.yuendong.sy.service.code.SyCodeType;
import com.yuendong.sy.service.code.impl.SyCodeService;

/**
 * 销售冻结申请服务类实现
 * @author huang.xuming [2013-7-30]
 *
 */
@Service("logicSoWarefreezeService")
public class LogicSoWarefreezeServiceImpl implements ILogicSoWarefreezeService {
	private static final Logger logger = Logger.getLogger(LogicSoWarefreezeServiceImpl.class);
	
	@Resource(name = "logicSoWarefreezeDAO")
	LogicSoWarefreezeDAO logicSoWarefreezeDAO;
	
	@Resource(name = "logicSoWarefreezeItemDAO")
	LogicSoWarefreezeItemDAO logicSoWarefreezeItemDAO;
	
	@Resource(name = "logicSoDAO")
	LogicSoDAO logicSoDAO;
	
	@Resource(name = "syCodeService")
	private SyCodeService syCodeService;
	
	@Override
	public SearchResult findListByExample(SearchConditions scs)
			throws SyBaseException {
		SearchResult rs=new SearchResult(scs);
		List<LogicSoWarefreezeDO> list=logicSoWarefreezeDAO.find(scs);
		rs.setRecordCount(logicSoWarefreezeDAO.count(scs));
		rs.setResults(list);
		return rs;
	}

	@Override
	public Integer delete(String id, User user) throws SyBaseException {
		return logicSoWarefreezeDAO.deleteLogicSoWarefreezeDOByPrimaryKey(id);
	}

	@Override
	@Transactional
	public Integer update(LogicSoWarefreezeDO t, User user)
			throws SyBaseException {
		t.setDuuser(user.getName());
		t.setDutime(new Date());
		return logicSoWarefreezeDAO.updateLogicSoWarefreezeDO(t);
	}

	@Override
	@Transactional
	public LogicSoWarefreezeDO save(LogicSoWarefreezeDO t, User user)
			throws SyBaseException {
		t.setDcruser(user.getName());
		t.setDctime(new Date());
		logicSoWarefreezeDAO.insertLogicSoWarefreezeDO(t);
		return t;
	}

	@Override
	public LogicSoWarefreezeDO findListById(String id) throws SyBaseException {
		return logicSoWarefreezeDAO.findLogicSoWarefreezeDOByPrimaryKey(id);
	}
	
	@Override
	public List<LogicSoWarefreezeItemDO> findItemListBysowarefreezeId(String sowarefreezeId) {
        List<LogicSoWarefreezeItemDO> list = logicSoWarefreezeItemDAO.findItemListBySoWareFreezeId(sowarefreezeId);
        return list;
    }
	
	@Override
	public void soWarefreezeSave(HttpServletRequest request, LogicSoWarefreezeDO curAP)
			throws SyBaseException {
		try {
			String itemdata = request.getParameter("itemdata");
			List<LogicSoWarefreezeItemDO> soItemlist = JSONArray.parseArray(itemdata,
					LogicSoWarefreezeItemDO.class);
			
			/*
			 * 获取操作
			 * 0为保存(草稿状态)
			 * 1为提交(待审核状态)
			 * 2为三级结案(提交三级结案)
			 * 3为二级驳回到草稿
			 * 4为拟稿人取消订单
			 */
			String paramflag = request.getParameter("paramflag");
			int iToFlag = -1;
			iToFlag = Integer.parseInt(paramflag);
			curAP.setBillstatus(Integer.parseInt(paramflag));
			
			User user = SessionUtil.getUser(request);
			Date curDate = new Date();
			
			
			if (StringUtils.isBlank(curAP.getId())) {
				/* 新增  设置状态billstatus= 0*/
				
				//---start 判断单据是否存在未完成处理的记录
				if(StringUtils.isBlank(curAP.getSoNo())){
					throw new SyBaseException("销售订单编号参数为空");
				}
				SearchConditions soScs = new SearchConditions();
				soScs.addCondition("so_no", curAP.getSoNo(), SearchCondition.OP_EQUAL);
				soScs.addCondition("billstatus", "2", SearchCondition.OP_NOTEQUAL);
				soScs.addCondition("billstatus", "4", SearchCondition.OP_NOTEQUAL);
				Integer count = logicSoWarefreezeDAO.count(soScs);
				if(null != count && count > 0){
					throw new SyBaseException(curAP.getSoNo()+"销售订单存在未处理的销售冻结申请单");
				}
				//---end 判断单据是否存在未完成处理的记录
				
				String id = IDCodeTypeUtil.getId();
				curAP.setId(id);
				curAP.setDctime(curDate);
				curAP.setDcruser(user.getName());
				
				curAP.setLister(user.getName());
				curAP.setListerName(user.getRealName());
				
				
				curAP.setNo(syCodeService.getCode("SD","SD",SyCode.DATE_YYMM,5));
				
				//日期转换处理
				String deliveryDate = request.getParameter("deliveryDate");
				if(StringUtils.isNotBlank(deliveryDate)){
					curAP.setDeliveryDate(DateUtils.stringToDate(deliveryDate));
				}
				String receipDate = request.getParameter("receipDate");
				if(StringUtils.isNotBlank(receipDate)){
					curAP.setReceipDate(DateUtils.stringToDate(receipDate));
				}
				
				curAP.setFrozenStatus(0);//未冻结
				logicSoWarefreezeDAO.insertLogicSoWarefreezeDO(curAP);
				
				curAP.setId(id);//添加上，否则插入之后ID为0
				saveOrUpdateItems(soItemlist, curAP);
				
				
				
			} else if(iToFlag >= 0 && iToFlag <=4){
				/* 修改 */
				LogicSoWarefreezeDO bean=logicSoWarefreezeDAO.findLogicSoWarefreezeDOByPrimaryKey(curAP.getId());
				if(null == bean.getVersion() || !bean.getVersion().equals(curAP.getVersion())){
					throw new SyBaseException("版本号异常，请刷新后重新编辑");
				}
				
				bean.setBillstatus(iToFlag);
				
				int result = 0;
				if(1==iToFlag ){//2为二级审核(提交二级审核)
					curAP.setBillstatus(bean.getBillstatus());
					
					curAP.setDctime(bean.getDctime());
					curAP.setDcruser(bean.getDcruser());
					
					curAP.setLister(user.getName());
					curAP.setListerName(user.getRealName());
					curAP.setDutime(curDate);
					curAP.setDuuser(user.getName());
					
					//日期转换处理
					String receipDate = request.getParameter("receipDate");
					if(StringUtils.isNotBlank(receipDate)){
						curAP.setReceipDate(DateUtils.stringToDate(receipDate));
					}
					String deliveryDate = request.getParameter("deliveryDate");
					if(StringUtils.isNotBlank(deliveryDate)){
						curAP.setDeliveryDate(DateUtils.stringToDate(deliveryDate));
					}
					
					result =logicSoWarefreezeDAO.updateLogicSoWarefreezeDO(curAP);
					if(result==1){
						saveOrUpdateItems(soItemlist, curAP);
					}
				}else if(2==iToFlag || 3==iToFlag){//3为二级驳回到草稿
					bean.setAuditor(user.getName());//二级
					bean.setAuditorName(user.getRealName());
					result =logicSoWarefreezeDAO.updateLogicSoWarefreezeDO(bean);
				}else if(4==iToFlag){//4为取消订单 
					bean.setDutime(bean.getDctime());
					bean.setDuuser(bean.getDcruser());
					result =logicSoWarefreezeDAO.updateLogicSoWarefreezeDO(bean);
					
				}
				if(result==0){
					throw new SyBaseException("您修改的行数据发生改变，请重新点开查看");
				}
				
			}else{
				throw new SyBaseException("ParamFlag不合法："+iToFlag);
			}
			
		} catch (Exception e) {
			//e.printStackTrace();
			logger.error(e.getMessage(), e);
			throw new SyBaseException(GlobalResLoader.getOpfailed()
					+ e.getMessage());
		}
	}

	/**
	 * 单据的子项持久化
	 * @param soItemlist
	 * @param curAP
	 */
	private void saveOrUpdateItems(List<LogicSoWarefreezeItemDO> soItemlist ,LogicSoWarefreezeDO curAP){
		//删除本订单下的item
				if(null != curAP.getId()){
					logicSoWarefreezeItemDAO.deleteLogicSoWarefreezeItemDOBySoWareFreezeId(curAP.getId());
				}
				
				//插入单据的item
				if(null != soItemlist){
					for (LogicSoWarefreezeItemDO soItemDO : soItemlist) {
						//对需要处理的item进行赋值
						soItemDO.setId(IDCodeTypeUtil.getId());
						soItemDO.setWarefreezeId(curAP.getId());
						soItemDO.setSoNo(curAP.getNo());
						soItemDO.setCliNo(curAP.getCliNo());
						soItemDO.setCliName(curAP.getCliName());
						
						logicSoWarefreezeItemDAO.insertLogicSoWarefreezeItemDO(soItemDO);
					}
				}
	}


	@Override
	public List<LogicSoWarefreezeDO> findItemListTimeout() {
		return logicSoWarefreezeDAO.findTimeout();
	}

	@Override
	public Integer deleteBizRemoved(String id) throws SyBaseException {
		// TODO Auto-generated method stub
		return null;
	}
	
//	/**
//	 * 冻结/解冻处理
//	 * @param soNo
//	 * @param freezeStatus
//	 */
//	private void updateSoFreezeStatus(String soNo,Integer freezeStatus){
//		SearchConditions scs = new SearchConditions();
//		scs.addCondition("no", soNo, SearchCondition.OP_EQUAL);
//		List<LogicSoDO> soList = logicSoDAO.find(scs);
//		if(null != soList && soList.size() > 0){
//			LogicSoDO so = soList.get(0);
//			LogicSoDO logicSoDO = new LogicSoDO();
//			logicSoDO.setId(so.getId());
//			logicSoDO.setFrozenStatus(freezeStatus);
//			logicSoDAO.updateLogicSoDO(logicSoDO);
//		}else{
//			String msg = soNo+"编号的销售订单查找失败，销售订单冻结标记修改失败。";
//			logger.error(msg);
//			throw new SyBaseException(msg);
//		}
//	}

//	@Override
//	@Transactional
//	public Integer updateToDelete(LogicSoWarefreezeDO t, User user)
//			throws SyBaseException {
//		t.setDuuser(user.getName());
//		t.setDutime(new Date());
//		
//		// 修改销售订单冻结标记-解冻
//		updateSoFreezeStatus(t.getSoNo(),0);
//		
//		return logicSoWarefreezeDAO.updateLogicSoWarefreezeDO(t);
//	}
}
